AST ์กฐ์๊ณผ ํ ํ๋ฆฟ ์์คํ ์ ์ฌ์ฉํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ฑ์ ์ธ๊ณ๋ฅผ ํํํ์ธ์. ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋์ ์ด๊ณ ํจ์จ์ ์ธ ์ฝ๋ ์๋ฃจ์ ์ ๊ตฌ์ถํ๋ ์ค์ฉ์ ์ธ ๊ธฐ์ ์ ๋ฐฐ์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ฑ: AST ์กฐ์ ๋ฐ ํ ํ๋ฆฟ ์์คํ ๋ง์คํฐํ๊ธฐ
๋์์์ด ์งํํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ ๋ฅ๋ ฅ์ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค. ์ ์ฐ์ฑ๊ณผ ๊ด๋ฒ์ํ ์ฑํ์ ์๋ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฃผ๋ก ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ(AST) ์กฐ์๊ณผ ํ ํ๋ฆฟ ์์คํ ์ฌ์ฉ์ ํตํด ์ด๋ฅผ ์ํ ๊ฒฌ๊ณ ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ ์ด๋ฌํ ๊ธฐ์ ์ ๊น์ด ํ๊ณ ๋ค์ด, ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ํจ์จ์ ์ด๊ณ ์ ์ ๊ฐ๋ฅํ ์ฝ๋ ์๋ฃจ์ ์ ๋ง๋๋ ๋ฐ ํ์ํ ์ง์์ ์ ๊ณตํฉ๋๋ค.
์ฝ๋ ์์ฑ ์ดํดํ๊ธฐ
์ฝ๋ ์์ฑ์ด๋ ์ฌ์, ํ ํ๋ฆฟ ๋๋ ๋ ๋์ ์์ค์ ํํ๊ณผ ๊ฐ์ ๋ค๋ฅธ ํํ์ ์ ๋ ฅ์ผ๋ก๋ถํฐ ์์ค ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ง๋๋ ๊ณผ์ ์ ๋๋ค. ์ด๋ ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ด์์ด๋ฉฐ, ๋ค์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค:
- ์์ฐ์ฑ ํฅ์: ๋ฐ๋ณต์ ์ธ ์ฝ๋ฉ ์์ ์ ์๋ํํ์ฌ ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ์ ๋ ์ ๋ต์ ์ธ ์ธก๋ฉด์ ์ง์คํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ฝ๋ ์ ์ง๋ณด์์ฑ: ์ฝ๋ ๋ก์ง์ ๋จ์ผ ์์ค์ ์ค์ ์ง์คํํ์ฌ ์ ๋ฐ์ดํธ์ ์ค๋ฅ ์์ ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
- ์ฝ๋ ํ์ง ํฅ์: ์๋ ์์ฑ์ ํตํด ์ฝ๋ฉ ํ์ค๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ฐ์ ํฉ๋๋ค.
- ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ: ๋ค์ํ ํ๋ซํผ๊ณผ ํ๊ฒฝ์ ๋ง๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ(AST)์ ์ญํ
์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ(AST)๋ ํน์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑ๋ ์์ค ์ฝ๋์ ์ถ์์ ์ธ ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋ฅผ ํธ๋ฆฌ ํํ๋ก ํํํ ๊ฒ์ ๋๋ค. ์ ์ฒด ์์ค ์ฝ๋๋ฅผ ๋ํ๋ด๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌ๋ฌธ ํธ๋ฆฌ์ ๋ฌ๋ฆฌ, AST๋ ์ฝ๋์ ์๋ฏธ์ ๊ด๋ จ ์๋ ์ธ๋ถ ์ฌํญ์ ์๋ตํฉ๋๋ค. AST๋ ๋ค์ ๋ถ์ผ์์ ์ค์ถ์ ์ธ ์ญํ ์ ํฉ๋๋ค:
- ์ปดํ์ผ๋ฌ: AST๋ ์์ค ์ฝ๋๋ฅผ ํ์ฑํ๊ณ ๊ธฐ๊ณ ์ฝ๋๋ก ๋ณํํ๋ ๊ธฐ์ด๋ฅผ ํ์ฑํฉ๋๋ค.
- ํธ๋์คํ์ผ๋ฌ: Babel์ด๋ TypeScript์ ๊ฐ์ ๋๊ตฌ๋ AST๋ฅผ ํ์ฉํ์ฌ ํ ์ธ์ด ๋ฒ์ ์ด๋ ๋ฐฉ์ธ์ผ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ๋ฒ์ ์ผ๋ก ๋ณํํฉ๋๋ค.
- ์ฝ๋ ๋ถ์ ๋๊ตฌ: ๋ฆฐํฐ, ์ฝ๋ ํฌ๋งคํฐ, ์ ์ ๋ถ์๊ธฐ๋ AST๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์ต์ ํํฉ๋๋ค.
- ์ฝ๋ ์์ฑ๊ธฐ: AST๋ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์กฐ์ํ ์ ์๊ฒ ํ์ฌ, ๊ธฐ์กด ๊ตฌ์กฐ๋ ์ฌ์์ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํฉ๋๋ค.
AST ์กฐ์: ์ฌ์ธต ๋ถ์
AST๋ฅผ ์กฐ์ํ๋ ๊ณผ์ ์ ์ฌ๋ฌ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค:
- ํ์ฑ(Parsing): ์์ค ์ฝ๋๋ฅผ ํ์ฑํ์ฌ AST๋ฅผ ์์ฑํฉ๋๋ค. `acorn`, `esprima`์ ๊ฐ์ ๋๊ตฌ๋ (์ผ๋ถ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์) ๋ด์ฅ `parse` ๋ฉ์๋๊ฐ ์ด๋ฅผ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฌผ์ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ๋๋ค.
- ์ํ(Traversal): ์์ ํ๊ฑฐ๋ ๋ถ์ํ๋ ค๋ ๋ ธ๋๋ฅผ ์๋ณํ๊ธฐ ์ํด AST๋ฅผ ์ํํฉ๋๋ค. `estraverse`์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํธ๋ฆฌ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์กฐ์ํ๋ ํธ๋ฆฌํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ฌ ์ด ๊ณผ์ ์ ์ ์ฉํฉ๋๋ค. ์ด๋ ์ข ์ข ํธ๋ฆฌ๋ฅผ ๋ฐ๋ผ ์ด๋ํ๋ฉฐ ๊ฐ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ๋ ธ๋ ์ ํ์ ๋ฐ๋ผ ์์ ์ ์ํํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ๋ณํ(Transformation): AST ๋ด์ ๋ ธ๋๋ฅผ ์์ , ์ถ๊ฐ ๋๋ ์ ๊ฑฐํฉ๋๋ค. ์ด๋ ๋ณ์ ์ด๋ฆ ๋ณ๊ฒฝ, ์ ๊ตฌ๋ฌธ ์ฝ์ ๋๋ ์ฝ๋ ๊ตฌ์กฐ ์ฌ๊ตฌ์ฑ์ ํฌํจํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ฝ๋ ์์ฑ์ ํต์ฌ์ ๋๋ค.
- ์ฝ๋ ์์ฑ(์ง๋ ฌํ): ์์ ๋ AST๋ `escodegen`(estraverse ์์ ๊ตฌ์ถ๋จ)์ด๋ `astring`๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์์ค ์ฝ๋๋ก ๋ณํ๋ฉ๋๋ค. ์ด๊ฒ์ด ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ ์์ฑํฉ๋๋ค.
์ค์ฉ์ ์ธ ์์ : ๋ณ์ ์ด๋ฆ ๋ณ๊ฒฝ
`oldVariable`์ด๋ผ๋ ์ด๋ฆ์ ๋ณ์ ๋ชจ๋ ๋ฐ์์ `newVariable`๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. `acorn`, `estraverse`, `escodegen`์ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค:
const acorn = require('acorn');
const estraverse = require('estraverse');
const escodegen = require('escodegen');
const code = `
const oldVariable = 10;
const result = oldVariable + 5;
console.log(oldVariable);
`;
const ast = acorn.parse(code, { ecmaVersion: 2020 });
estraverse.traverse(ast, {
enter: (node, parent) => {
if (node.type === 'Identifier' && node.name === 'oldVariable') {
node.name = 'newVariable';
}
}
});
const newCode = escodegen.generate(ast);
console.log(newCode);
์ด ์์ ๋ AST๋ฅผ ํ์ฑ, ์ํ, ๋ณํํ์ฌ ๋ณ์ ์ด๋ฆ ๋ณ๊ฒฝ์ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋์ผํ ํ๋ก์ธ์ค๋ฅผ ๋ฉ์๋ ํธ์ถ, ํด๋์ค ์ ์, ์ ์ฒด ์ฝ๋ ๋ธ๋ก๊ณผ ๊ฐ์ ๋ ๋ณต์กํ ๋ณํ์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค.
์ฝ๋ ์์ฑ์ ์ํ ํ ํ๋ฆฟ ์์คํ
ํ ํ๋ฆฟ ์์คํ ์ ์ฝ๋ ์์ฑ์ ๋ ๊ตฌ์กฐํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ฉฐ, ํนํ ๋ฏธ๋ฆฌ ์ ์๋ ํจํด๊ณผ ๊ตฌ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์ด๋ ์ฝ๋ ์์ฑ ๋ก์ง์ ์ฝํ ์ธ ์ ๋ถ๋ฆฌํ์ฌ ๋ ๊น๋ํ ์ฝ๋์ ์ฌ์ด ์ ์ง๋ณด์๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ฌํ ์์คํ ์ ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์ด์คํ๋์ ๋ก์ง์ ํฌํจํ๋ ํ ํ๋ฆฟ ํ์ผ๊ณผ ํด๋น ํ๋ ์ด์คํ๋๋ฅผ ์ฑ์ธ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ ํ๋ฆฟ ์์ง:
- Handlebars.js: ๊ฐ๋จํ๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ฉฐ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค. ํ ํ๋ฆฟ์์ HTML ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ ๋ง์ต๋๋ค.
- Mustache: ๋ก์ง์ด ์๋(logic-less) ํ ํ๋ฆฟ ์์ง์ผ๋ก, ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๊ฐ ๋ฌด์๋ณด๋ค ์ค์ํ ๊ฒฝ์ฐ์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
- EJS (Embedded JavaScript): HTML ํ ํ๋ฆฟ ๋ด์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ์ฝ์ ํฉ๋๋ค. ํ ํ๋ฆฟ ๋ด์์ ๋ณต์กํ ๋ก์ง์ ํ์ฉํฉ๋๋ค.
- Pug (์ด์ Jade): ๊น๋ํ๊ณ ๋ค์ฌ์ฐ๊ธฐ ๊ธฐ๋ฐ ๊ตฌ๋ฌธ์ ๊ฐ์ง ๊ณ ์ฑ๋ฅ ํ ํ๋ฆฟ ์์ง์ ๋๋ค. ๋ฏธ๋๋ฉ๋ฆฌ์คํธ ์ ๊ทผ ๋ฐฉ์์ ์ ํธํ๋ ๊ฐ๋ฐ์๋ค์ด ์ ํธํฉ๋๋ค.
- Nunjucks: Jinja2์์ ์๊ฐ์ ๋ฐ์ ์ ์ฐํ ํ ํ๋ฆฟ ์ธ์ด์ ๋๋ค. ์์, ๋งคํฌ๋ก ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Handlebars.js ์ฌ์ฉ ์์
Handlebars.js๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฐ๋จํ ์์ ๋ฅผ ์์ฐํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ผ๋ จ์ ํจ์ ์ ์๋ฅผ ์์ฑํด์ผ ํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ํ ํ๋ฆฟ ํ์ผ(์: `functionTemplate.hbs`)๊ณผ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
functionTemplate.hbs:
{{#each functions}}
function {{name}}() {
console.log("Executing {{name}}");
}
{{/each}}
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋:
const Handlebars = require('handlebars');
const fs = require('fs');
const templateSource = fs.readFileSync('functionTemplate.hbs', 'utf8');
const template = Handlebars.compile(templateSource);
const data = {
functions: [
{ name: 'greet' },
{ name: 'calculateSum' },
{ name: 'displayMessage' }
]
};
const generatedCode = template(data);
console.log(generatedCode);
์ด ์์ ๋ ํ ํ๋ฆฟ์ ๋ก๋ํ๊ณ , ์ปดํ์ผํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๊ณ , ์ถ๋ ฅ์ ์์ฑํ๋ ๊ธฐ๋ณธ ๊ณผ์ ์ ๋ณด์ฌ์ค๋๋ค. ์์ฑ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค:
function greet() {
console.log("Executing greet");
}
function calculateSum() {
console.log("Executing calculateSum");
}
function displayMessage() {
console.log("Executing displayMessage");
}
Handlebars๋ ๋๋ถ๋ถ์ ํ ํ๋ฆฟ ์์คํ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๋ณต, ์กฐ๊ฑด๋ถ ๋ก์ง, ํฌํผ ํจ์์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๋ณต์กํ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ ๊ตฌ์กฐ์ ์ด๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
AST ์กฐ์๊ณผ ํ ํ๋ฆฟ ์์คํ ๋น๊ต
AST ์กฐ์๊ณผ ํ ํ๋ฆฟ ์์คํ ๋ชจ๋ ์ฅ๋จ์ ์ด ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ๋ ๊ฒ์ ์ฝ๋ ์์ฑ ์์ ์ ๋ณต์ก์ฑ, ์ ์ง๋ณด์ ์๊ตฌ ์ฌํญ ๋ฐ ์ํ๋ ์ถ์ํ ์์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
| ๊ธฐ๋ฅ | AST ์กฐ์ | ํ ํ๋ฆฟ ์์คํ |
|---|---|---|
| ๋ณต์ก์ฑ | ๋ณต์กํ ๋ณํ์ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ์ฝ๋ ๊ตฌ์กฐ์ ๋ํ ๊น์ ์ดํด๊ฐ ํ์ํฉ๋๋ค. | ํจํด๊ณผ ๋ฏธ๋ฆฌ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค. ๊ฐ๋จํ ๊ฒฝ์ฐ์ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. |
| ์ถ์ํ | ๋ ๋ฎ์ ์์ค์ผ๋ก, ์ฝ๋ ์์ฑ์ ๋ํ ์ธ๋ฐํ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. | ๋ ๋์ ์์ค์ผ๋ก, ๋ณต์กํ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์ถ์ํํ์ฌ ํ ํ๋ฆฟ ์ ์๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. |
| ์ ์ง๋ณด์์ฑ | AST ์กฐ์์ ๋ณต์ก์ฑ ๋๋ฌธ์ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ์ฝ๋ ๊ตฌ์กฐ์ ๋ํ ๊น์ ์ง์์ด ํ์ํฉ๋๋ค. | ๊ด์ฌ์ฌ ๋ถ๋ฆฌ(๋ก์ง ๋ ๋ฐ์ดํฐ)๊ฐ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๊ณ ๊ฒฐํฉ๋๋ฅผ ์ค์ฌ ์ผ๋ฐ์ ์ผ๋ก ์ ์ง๋ณด์๊ฐ ๋ ์ฝ์ต๋๋ค. |
| ์ฌ์ฉ ์ฌ๋ก | ํธ๋์คํ์ผ๋ฌ, ์ปดํ์ผ๋ฌ, ๊ณ ๊ธ ์ฝ๋ ๋ฆฌํฉํ ๋ง, ๋ณต์กํ ๋ถ์ ๋ฐ ๋ณํ. | ๊ตฌ์ฑ ํ์ผ ์์ฑ, ๋ฐ๋ณต์ ์ธ ์ฝ๋ ๋ธ๋ก, ๋ฐ์ดํฐ๋ ์ฌ์ ๊ธฐ๋ฐ ์ฝ๋, ๊ฐ๋จํ ์ฝ๋ ์์ฑ ์์ . |
๊ณ ๊ธ ์ฝ๋ ์์ฑ ๊ธฐ์
๊ธฐ๋ณธ์ ๋์ด, ๊ณ ๊ธ ๊ธฐ์ ์ ์ฝ๋ ์์ฑ์ ๋์ฑ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋น๋ ๋จ๊ณ๋ก์์ ์ฝ๋ ์์ฑ: Webpack, Grunt ๋๋ Gulp์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ ํ๋ก์ธ์ค์ ์ฝ๋ ์์ฑ์ ํตํฉํ์ธ์. ์ด๋ ์์ฑ๋ ์ฝ๋๊ฐ ํญ์ ์ต์ ์ํ์์ ๋ณด์ฅํฉ๋๋ค.
- ํ๋ฌ๊ทธ์ธ์ผ๋ก์์ ์ฝ๋ ์์ฑ๊ธฐ: ์ฝ๋๋ฅผ ์์ฑํ๋ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค์ด ๊ธฐ์กด ๋๊ตฌ๋ฅผ ํ์ฅํ์ธ์. ์๋ฅผ ๋ค์ด, ๊ตฌ์ฑ ํ์ผ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋น๋ ์์คํ ์ฉ ์ฌ์ฉ์ ์ ์ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค ์ ์์ต๋๋ค.
- ๋์ ๋ชจ๋ ๋ก๋ฉ: ๋ฐํ์ ์กฐ๊ฑด์ด๋ ๋ฐ์ดํฐ ๊ฐ์ฉ์ฑ์ ๋ฐ๋ผ ๋์ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ ๋๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์ด๋ ์ฝ๋์ ์ ์์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
- ์ฝ๋ ์์ฑ ๋ฐ ๊ตญ์ ํ(i18n): ์ธ์ด ํ์งํ ๋ฐ ์ง์ญ์ ๋ณํ์ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ธ์. ์ด๋ ๊ธ๋ก๋ฒ ํ๋ก์ ํธ์ ํ์์ ์ ๋๋ค. ์ง์๋๋ ๊ฐ ์ธ์ด์ ๋ํด ๋ณ๋์ ํ์ผ์ ์์ฑํ์ธ์.
- ์์ฑ๋ ์ฝ๋ ํ ์คํธ: ์์ฑ๋ ์ฝ๋๊ฐ ์ ํํ๊ณ ์ฌ์์ ์ถฉ์กฑํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฒ ์ ํ ๋จ์ ๋ฐ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์. ์๋ํ๋ ํ ์คํธ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ์์
์ฝ๋ ์์ฑ์ ์ ์ธ๊ณ์ ์ผ๋ก ๊ด๋ฒ์ํ ์ฐ์ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์น๊ฐ ์์ต๋๋ค:
- ๊ตญ์ ํ ๋ฐ ํ์งํ: ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ผ๋ณธ๊ณผ ๋ ์ผ์ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ๋ ํ๋ก์ ํธ๋ ์ผ๋ณธ์ด์ ๋ ์ผ์ด ๋ฒ์ญ์ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์๊ฐํ: ๋ค์ํ ์์ค(๋ฐ์ดํฐ๋ฒ ์ด์ค, API)์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์ฐจํธ์ ๊ทธ๋ํ๋ฅผ ๋ ๋๋งํ๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ๋ฏธ๊ตญ, ์๊ตญ, ์ฑ๊ฐํฌ๋ฅด์ ๊ธ์ต ์์ฅ์ ๋์์ผ๋ก ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์จ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์ฐจํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- API ํด๋ผ์ด์ธํธ: OpenAPI ๋๋ Swagger ์ฌ์์ ๊ธฐ๋ฐ์ผ๋ก API์ฉ ์๋ฐ์คํฌ๋ฆฝํธ ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ API ์๋น์ค๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ๊ณ ํตํฉํ ์ ์์ต๋๋ค.
- ํฌ๋ก์ค ํ๋ซํผ ๊ฐ๋ฐ: ๋จ์ผ ์์ค์์ ๋ค์ํ ํ๋ซํผ(์น, ๋ชจ๋ฐ์ผ, ๋ฐ์คํฌํฑ)์ฉ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ์ ํฅ์์ํต๋๋ค. ๋ธ๋ผ์ง๊ณผ ์ธ๋์ ์ฌ์ฉ์์๊ฒ ๋๋ฌํ๋ ค๋ ํ๋ก์ ํธ๋ ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ชจ๋ฐ์ผ ํ๋ซํผ์ ์ ์ํ ์ ์์ต๋๋ค.
- ๊ตฌ์ฑ ๊ด๋ฆฌ: ํ๊ฒฝ ๋ณ์๋ ์ฌ์ฉ์ ์ค์ ์ ๋ฐ๋ผ ๊ตฌ์ฑ ํ์ผ์ ์์ฑํฉ๋๋ค. ์ด๋ ์ ์ธ๊ณ์ ๊ฐ๋ฐ, ํ ์คํธ ๋ฐ ํ๋ก๋์ ํ๊ฒฝ์ ๋ํด ๋ค๋ฅธ ๊ตฌ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ฝ๋ ์์ฑ์ ์ฌ์ฉํฉ๋๋ค.
์์ : API ํด๋ผ์ด์ธํธ ์ฝ๋ ์์ฑ:
๋ค๋ฅธ ๊ตญ๊ฐ์ ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด์ ํตํฉํด์ผ ํ๋ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ๊ตฌ์ถํ๊ณ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ค์์ ์ํํ ์ ์์ต๋๋ค:
- ๊ฐ ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด(์: Stripe, PayPal, ์ฌ๋ฌ ๊ตญ๊ฐ์ ํ์ง ๊ฒฐ์ ์๋จ)์ ๋ํ ํน์ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
- ์ฌ์ฉ์์ ์์น์ ๋ฐ๋ผ ํตํ ๋ณํ ๋ฐ ์ธ๊ธ ๊ณ์ฐ์ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค(i18n์ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ํ์).
- ๋ฌธ์ ๋ฐ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ํธ์ฃผ, ์บ๋๋ค, ํ๋์ค์ ๊ฐ์ ๊ตญ๊ฐ์ ๊ฐ๋ฐ์๋ค์ด ํตํฉ์ ํจ์ฌ ์ฝ๊ฒ ํ ์ ์๋๋ก ํฉ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๊ณ ๋ ค ์ฌํญ
์ฝ๋ ์์ฑ์ ํจ๊ณผ๋ฅผ ๊ทน๋ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
- ๋ช ํํ ์ฌ์ ์ ์: ์ ๋ ฅ ๋ฐ์ดํฐ, ์ํ๋ ์ถ๋ ฅ ์ฝ๋ ๋ฐ ๋ณํ ๊ท์น์ ๋ช ํํ๊ฒ ์ ์ํ์ธ์.
- ๋ชจ๋์ฑ: ์ฝ๋ ์์ฑ๊ธฐ๋ฅผ ์ ์ง๋ณด์ํ๊ณ ์ ๋ฐ์ดํธํ๊ธฐ ์ฝ๋๋ก ๋ชจ๋์์ผ๋ก ์ค๊ณํ์ธ์. ์์ฑ ๊ณผ์ ์ ๋ ์๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ก ๋๋์ธ์.
- ์ค๋ฅ ์ฒ๋ฆฌ: ํ์ฑ, ์ํ, ์ฝ๋ ์์ฑ ์ค ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ๋ณด๊ณ ํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ธ์. ์๋ฏธ ์๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ธ์.
- ๋ฌธ์ํ: ์ ๋ ฅ ํ์, ์ถ๋ ฅ ์ฝ๋ ๋ฐ ๋ชจ๋ ์ ํ ์ฌํญ์ ํฌํจํ์ฌ ์ฝ๋ ์์ฑ๊ธฐ๋ฅผ ์ฒ ์ ํ ๋ฌธ์ํํ์ธ์. ์์ฑ๊ธฐ๊ฐ ๊ณต์ ๋ ์์ ์ด๋ผ๋ฉด ์ข์ API ๋ฌธ์๋ฅผ ๋ง๋์ธ์.
- ํ ์คํธ: ์ฝ๋ ์์ฑ ํ๋ก์ธ์ค์ ๋ชจ๋ ๋จ๊ณ์ ๋ํด ์๋ํ๋ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ์ธ์. ์ฌ๋ฌ ๋ฐ์ดํฐ ์ธํธ์ ๊ตฌ์ฑ์ผ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ํ ์คํธํ์ธ์.
- ์ฑ๋ฅ: ์ฝ๋ ์์ฑ ํ๋ก์ธ์ค๋ฅผ ํ๋กํ์ผ๋งํ๊ณ ํนํ ๋๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ต์ ํํ์ธ์.
- ์ ์ง๋ณด์์ฑ: ์ฝ๋ ์์ฑ ํ๋ก์ธ์ค๋ฅผ ๊น๋ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๊ฒ ์ ์งํ์ธ์. ์ฝ๋ฉ ํ์ค, ์ฃผ์์ ์ฌ์ฉํ๊ณ ๊ณผ๋ํ ๋ณต์ก์ฑ์ ํผํ์ธ์.
- ๋ณด์: ์ฝ๋ ์์ฑ์ ์์ค ๋ฐ์ดํฐ์ ์ฃผ์ํ์ธ์. ๋ณด์ ์ํ(์: ์ฝ๋ ์ฃผ์ )์ ํผํ๊ธฐ ์ํด ์ ๋ ฅ์ ๊ฒ์ฆํ์ธ์.
์ฝ๋ ์์ฑ์ ์ํ ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ค์ํ ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ฑ์ ์ง์ํฉ๋๋ค.
- AST ํ์ฑ ๋ฐ ์กฐ์: `acorn`, `esprima`, `babel`(ํ์ฑ ๋ฐ ๋ณํ์ฉ), `estraverse`.
- ํ ํ๋ฆฟ ์์ง: `Handlebars.js`, `Mustache.js`, `EJS`, `Pug`, `Nunjucks`.
- ์ฝ๋ ์์ฑ(์ง๋ ฌํ): `escodegen`, `astring`.
- ๋น๋ ๋๊ตฌ: `Webpack`, `Gulp`, `Grunt`(์์ฑ์ ๋น๋ ํ์ดํ๋ผ์ธ์ ํตํฉํ๊ธฐ ์ํด).
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ฑ์ ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์์ด ๊ฐ์น ์๋ ๊ธฐ์ ์ ๋๋ค. AST ์กฐ์์ ์ ํํ๋ ํ ํ๋ฆฟ ์์คํ ์ ์ ํํ๋ , ์ด๋ฌํ ๊ธฐ์ ์ ๋ง์คํฐํ๋ฉด ์ฝ๋ ์๋ํ, ์ฝ๋ ํ์ง ํฅ์ ๋ฐ ์์ฐ์ฑ ์ฆ๋๋ฅผ ์ํ ์๋นํ ๊ฐ๋ฅ์ฑ์ด ์ด๋ฆฝ๋๋ค. ์ด๋ฌํ ์ ๋ต์ ์ฑํํจ์ผ๋ก์จ, ๊ธ๋ก๋ฒ ํ๊ฒฝ์ ์ ํฉํ ์ ์ ๊ฐ๋ฅํ๊ณ ํจ์จ์ ์ธ ์ฝ๋ ์๋ฃจ์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ํ๋ก์ ํธ์์ ์ฅ๊ธฐ์ ์ธ ์ฑ๊ณต์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ฉํ๊ณ , ์ฌ๋ฐ๋ฅธ ๋๊ตฌ๋ฅผ ์ ํํ๋ฉฐ, ์ ์ง๋ณด์์ฑ๊ณผ ํ ์คํธ๋ฅผ ์ฐ์ ์ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.